جزوه · فصل نهم · جلسه ۹۱ · راه‌اندازی فرمان در حالت‌های خاص ← بازگشت به فهرست
📘 فصل نهم · جلسه ۹۱ راه‌اندازی فرمان در حالت‌های خاص
📅 تاریخ: پنجشنبه، ۴ شهریور ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian (کالی) · 📦 Red Hat
این جلسه یکی از مباحث کاربردی در مدیریت سیستم است. مفاهیم &، jobs، fg، bg و nohup در آزمون‌های LPIC و RHCSA بسیار پرتکرارند.
🔄 قبل از شروع، یه مثال ساده:

فرض کن داری یه فیلم بزرگ دانلود می‌کنی. می‌خوای همزمان بتنی با مرورگر کار کنی، هم موسیقی گوش بدی و هم دانلود ادامه داشته باشه. توی لینوکس، با مدیریت پردازش‌ها می‌تونی این کار رو انجام بدی! این جلسه بهت یاد میده چطور فرمان‌ها رو به پس‌زمینه بفرستی، بین پردازش‌ها جابه‌جا بشی و حتی وقتی ترمینال رو می‌بندی، فرمان‌هات ادامه داشته باشن!

▍ اجرای فرمان در پس‌زمینه با &

به طور پیش‌فرض، وقتی یک فرمان را در ترمینال اجرا می‌کنید، ترمینال قفل می‌شود و تا زمانی که آن فرمان تمام نشود، نمی‌توانید کار دیگری انجام دهید. برای رفع این مشکل، می‌توانید فرمان را با & به پس‌زمینه بفرستید.

command &
┌──(ya3in㉿kali)-[~] └─$ sleep 30 & [1] 12345 └─$ echo "این دستور بدون منتظر ماندن اجرا شد!" این دستور بدون منتظر ماندن اجرا شد!

توضیح:

🔑 نکته کلیدی: با اضافه کردن & به انتهای یک فرمان، آن فرمان در پس‌زمینه اجرا می‌شود و ترمینال برای کارهای دیگر آزاد می‌شود.
نکته: خروجی فرمان‌های پس‌زمینه همچنان در ترمینال نمایش داده می‌شود، مگر اینکه به فایل هدایت شود.

▍ نمایش پردازش‌های پس‌زمینه با jobs

jobs لیست تمام پردازش‌هایی که در پس‌زمینه یا متوقف شده‌اند را نمایش می‌دهد.

┌──(ya3in㉿kali)-[~] └─$ sleep 100 & [1] 12345 └─$ sleep 200 & [2] 12346 └─$ jobs [1]- Running sleep 100 & [2]+ Running sleep 200 &

توضیح:

نکته: jobs فقط پردازش‌های همان شل (Shell) را نشان می‌دهد. برای مشاهدهٔ همهٔ پردازش‌های سیستم از ps استفاده کنید.

▍ آوردن پردازش به جلو (Foreground) با fg

fg (مخفف Foreground) یک پردازش را از پس‌زمینه به جلو می‌آورد و ترمینال را در اختیار آن قرار می‌دهد.

fg %[Job ID]
┌──(ya3in㉿kali)-[~] └─$ sleep 100 & [1] 12345 └─$ fg %1 # ترمینال قفل می‌شود و sleep 100 در حال اجراست

توضیح: fg %1 پردازش شمارهٔ ۱ را به جلو می‌آورد. ترمینال تا زمانی که این پردازش تمام نشود، در اختیار شما نخواهد بود.

💡 نکته: اگر فقط fg را بدون شماره اجرا کنید، آخرین پردازش (که با + مشخص شده) را به جلو می‌آورد.

▍ ادامهٔ پردازش متوقف‌شده در پس‌زمینه با bg

bg (مخفف Background) یک پردازش متوقف‌شده را در پس‌زمینه ادامه می‌دهد.

bg %[Job ID]
┌──(ya3in㉿kali)-[~] └─$ sleep 100 # ترمینال قفل شد، کلیدهای Ctrl+Z را می‌زنیم [1]+ Stopped sleep 100 └─$ bg %1 [1]+ sleep 100 & └─$ jobs [1]+ Running sleep 100 &

توضیح:

نکته: Ctrl+Z پردازش را متوقف می‌کند، نه خاتمه. برای خاتمه از Ctrl+C استفاده کنید.

▍ جدول خلاصه دستورات مدیریت پردازش

دستور کاربرد مثال
& اجرای فرمان در پس‌زمینه sleep 30 &
jobs نمایش پردازش‌های پس‌زمینه jobs -l (با PID)
fg %N آوردن پردازش N به جلو fg %1
bg %N ادامهٔ پردازش N در پس‌زمینه bg %1
Ctrl+Z متوقف کردن پردازش جاری در حین اجرای فرمان
Ctrl+C خاتمه دادن به پردازش جاری در حین اجرای فرمان

▍ اجرای فرمان بدون نیاز به ترمینال با nohup

nohup (مخفف No Hang Up) به شما اجازه می‌دهد فرمانی را اجرا کنید که حتی پس از بسته شدن ترمینال نیز به کار خود ادامه دهد.

nohup command [arguments] &
🔑 نکته کلیدی: nohup سیگنال SIGHUP (که هنگام بسته شدن ترمینال به پردازش‌ها ارسال می‌شود) را نادیده می‌گیرد و پردازش به کار خود ادامه می‌دهد.
┌──(ya3in㉿kali)-[~] └─$ nohup ./long_running_script.sh & nohup: ignoring input and appending output to 'nohup.out' [1] 12345

توضیح:

نکته امتحانی: nohup برای اجرای فرمان‌های طولانی‌مدت که باید حتی پس از خروج از سیستم ادامه داشته باشند، استفاده می‌شود.

• مثال عملی با nohup

#!/bin/bash # اسکریپتی که باید حتی پس از خروج از ترمینال ادامه داشته باشد nohup ping -i 10 google.com > ping.log 2>&1 & # ping.log شامل خروجی پینگ خواهد بود # حتی پس از بستن ترمینال، پینگ ادامه خواهد داشت

توضیح:

▍ مقایسه روش‌های مختلف اجرا

روش پس‌زمینه ادامه پس از بستن ترمینال خروجی کجا می‌رود؟
command ❌ خیر ❌ خیر (متوقف می‌شود) ترمینال
command & ✅ بله ❌ خیر (متوقف می‌شود) ترمینال (آشفته)
nohup command & ✅ بله ✅ بله (ادامه دارد) nohup.out
nohup command > file 2>&1 & ✅ بله ✅ بله (ادامه دارد) فایل مشخص‌شده

▍ نکات مهم و جمع‌بندی

✅ جمع‌بندی نهایی:
  • & → فرمان را در پس‌زمینه اجرا می‌کند.
  • jobs → لیست پردازش‌های پس‌زمینه را نشان می‌دهد.
  • fg → پردازش را به جلو (Foreground) می‌آورد.
  • bg → پردازش متوقف‌شده را در پس‌زمینه ادامه می‌دهد.
  • Ctrl+Z → پردازش جاری را متوقف می‌کند.
  • Ctrl+C → پردازش جاری را خاتمه می‌دهد.
  • nohup → فرمان را از ترمینال جدا کرده و پس از بستن ترمینال نیز ادامه می‌دهد.
  • nohup.out → فایل پیش‌فرض خروجی nohup.
📝 تمرین پیشنهادی:

یک اسکریپت بنویسید که:

  • یک حلقهٔ while نامحدود با sleep 5 ایجاد کند که هر ۵ ثانیه یک پیام چاپ کند.
  • این اسکریپت را با nohup در پس‌زمینه اجرا کنید.
  • خروجی را به فایل my_log.log هدایت کنید.
  • ترمینال را ببندید و دوباره باز کنید و با tail -f my_log.log خروجی را مشاهده کنید.